package com.jt.reflection;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class testApp {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//        HelloServiceImpl service = new HelloServiceImpl();
//        service.sayHello("张三");
        //使用反射机制执行sayhello方法，核心method方法
        HelloServiceImpl target = new HelloServiceImpl();
        //获取sayhello名称对于的method类对象
       Method method= HelloService.class.getMethod("sayHello", String.class);
   //通过method可以执行sayhello方法调用
        /*invoke用来执行方法的调用
        * 1、Object 表示对象，要执行这个对象的方法
        * 2、Object... 方法执行时的参数值*/
        Object ret = method.invoke(target, "李四");
        /*代理完成的功能：
        * 1、调用目标方法，执行目标方法的功能
        * 2、功能增强，在目标方法调用时，增加功能
        * 怎么用；1、实现接口：invocationHandler
        *       2、重写invoke（）方法，把原来静态代理中代理要完成的功能
        * 2）Method类：表示方法的，确切来说就是目标类中的方法
        * 作用：通过Method可以执行某个目标类的方法，Method.invoke()
        *  method().invoke(目标对象，方法的参数)
        * Object ret=method.invoke(service2,"李四")
        * 说明：method.invoke()就是用来执行目标方法的，等同于静态代理中的
        * float price=factory.sell(amount);//厂家的价格
        *
        * Proxy类：核心的对象，创建代理对象，之前创建对象都是new类的构造方法
        * 闲杂我们是使用proxy类的方法，代替new使用
        *
        * 方法：静态方法 newProxyInatance()
        * 作用是：创建代理对象，等同于静态代理中的Tao tao=new TaoBao()
        *
        *
        *
        *3、实现动态代理的步骤;
        * 1、创建接口，定义目标类要完成的功能
        * 2、创建目标类的实现接口
        * 3、闯海南InvocationHandler接口的实现类，在invoke方法中完成代理类的功能
        *   1、增强目标方法
        *   2、增强功能
        *4、使用Proxy类的静态方法，创建代理对象，并把返回值转为接口类型 */

    }

}
